package com.game.frame.GameFrame.GameFrameMain;

import java.awt.*;
import java.awt.image.BufferedImage;

/**
 * 抽象类BaseCharacter代表游戏中的基础角色
 * 该类定义了角色的基本属性和行为，如移动、生命值管理等
 * 子类需要实现具体的动画更新和生命值显示方法
 */
public abstract class BaseCharacter {
    // 角色的坐标
    protected int x, y;
    // 游戏面板
    protected final GamePanel gamePanel;
    // 当前显示的图片
    protected BufferedImage currentImage;
    // 角色面向的方向
    protected boolean facingRight = true;
    // 当前帧的索引
    protected int currentFrameIndex = 0;
    // 生命值
    protected int health;

    protected int attackDamage;           // 攻击伤害
    protected int attackRange;            // 攻击范围
    protected boolean isAttacking;        // 是否正在攻击
    protected Rectangle attackBox;        // 攻击碰撞箱

    // 角色的宽度和高度
    protected static final int CHARACTER_WIDTH = 200;
    protected static final int CHARACTER_HEIGHT = 200;

    /**
     * 构造一个新的基础角色实例
     *
     * @param panel 游戏面板，角色所在的游戏场景
     * @param startX 角色的起始X坐标
     * @param startY 角色的起始Y坐标
     * @param initialHealth 角色的初始生命值
     */
    public BaseCharacter(GamePanel panel, int startX, int startY, int initialHealth) {
        this.gamePanel = panel;
        this.x = startX;
        this.y = startY;
        this.health = initialHealth;
        this.attackBox = new Rectangle();
    }

    /**
     * 抽象方法，更新角色的动画状态
     * 子类必须实现此方法以定义具体的动画逻辑
     */
    public abstract void updateAnimation();

    /**
     * 抽象方法，绘制角色的生命值
     * 子类必须实现此方法以定义如何显示生命值
     *
     * @param g Graphics对象，用于绘制生命值
     */
    public abstract void drawBlood(Graphics g);

    /**
     * 检查是否击中目标
     */
    protected boolean checkHit(BaseCharacter target) {
        return attackBox.intersects(
                target.x,
                target.y,
                CHARACTER_WIDTH,
                CHARACTER_HEIGHT
        );
    }

    /**
     * 角色受到伤害时减少生命值
     * 此方法确保生命值不会小于0
     *
     * @param damage 受到的伤害值
     */
    public void takeDamage(int damage) {
        health -= damage;
        if (health < 0) health = 0;
    }

    /**
     * 判断角色是否死亡
     */
    public boolean isDead() {
        return health <= 0;
    }

    /**
     * 更新攻击碰撞箱位置
     */
    protected void updateAttackBox() {
        if (facingRight) {
            attackBox.setBounds(x + CHARACTER_WIDTH/2, y, attackRange, CHARACTER_HEIGHT);
        } else {
            attackBox.setBounds(x - attackRange + CHARACTER_WIDTH/2, y, attackRange, CHARACTER_HEIGHT);
        }
    }

    /**
     * 移动角色的位置
     * 此方法确保角色不会移出游戏面板的边界
     *
     * @param dx 水平方向的移动距离
     * @param dy 垂直方向的移动距离
     */
    protected void move(int dx, int dy) {
        int newX = x + dx;
        int newY = y + dy;

        if (newX >= 0 && newX <= gamePanel.getPanelWidth() - CHARACTER_WIDTH) {
            x = newX;
        }
        if (newY >= 0 && newY <= gamePanel.getPanelHeight() - CHARACTER_HEIGHT) {
            y = newY;
        }
    }

    // Getter方法
    public int getX() { return x; }
    public int getY() { return y; }
    public int getHealth() { return health; }
}
